package com.mlick.dddk.utils;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.TrafficStats;

import java.util.List;

/**
 * Created by mlick on 2018-03-27.
 * Android流量监控
 *
 * https://blog.csdn.net/dexFeng/article/details/70862196
 * 背景：客户反映公司的APP在几部手机上流量超支，需要自证清白，否则要帮客户垫付超出的流量费用。
 * 流量超支之后手机早已停机，距今已有半年多，手机的日志文件莫名奇妙丢失，客户一口咬定是程序问题，大家相互扯来扯去。
 * 为了避免这个问题就有了这个监控自身程序流量的需求。
 *
 */
public class TrafficStatsUtils {


    //这是一个测试系统流量统计类TrafficStats的程序，使用该类可以方便的实现APP流量监控；
    //
    //TrafficStats类使用总结：
    //        1、该类直接提供方法：所有APP使用移动网络的流量和包的数量、所有APP使用网络的流量和包的数量、某个APP使用网络的流量和包的数量；
    //
    //        2、该类提供的数据是以手机开关机来累计的，关机重启后数据会重置为0；
    //
    //        3、通过该类无法直接获取某个APP使用移动网络和wifi网络的流量统计，如果需要区分网络类型进行统计流量的话，需要开启后台服务，
    //           并监听网络状态变化广播，根据网络状态变化自己记录并计算出不同网络类型下的流量统计；
    //
    //        4、该类提供的所有网络流量统计数据可能不仅仅包括移动网络和wifi网络，也可能包括APP间socket通信产生的流量；

    /**
     * 遍历有联网权限的应用程序的流量记录
     */
    private void trafficMonitor(Context context) {
        PackageManager pm = context.getPackageManager();
        List<PackageInfo> packinfos = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_PERMISSIONS);
        for (PackageInfo info : packinfos) {
            String[] premissions = info.requestedPermissions;
            if (premissions != null && premissions.length > 0) {
                for (String premission : premissions) {
                    if ("android.permission.INTERNET".equals(premission)) {
                        System.out.println(info.packageName + "访问网络");
                        int uid = info.applicationInfo.uid;
                        long rx = TrafficStats.getUidRxBytes(uid);
                        long tx = TrafficStats.getUidTxBytes(uid);


                        //AppTrafficModel appTrafficModel = new AppTrafficModel();
                        //appTrafficModel.setAppInfo(info.applicationInfo);
                        //appTrafficModel.setDownload(rx);
                        //appTrafficModel.setUpload(tx);
                        //listApps.add(appTrafficModel);


                        /** 获取手机通过 2G/3G 接收的字节流量总数 */
                        TrafficStats.getMobileRxBytes();
                        /** 获取手机通过 2G/3G 接收的数据包总数 */
                        TrafficStats.getMobileRxPackets();
                        /** 获取手机通过 2G/3G 发出的字节流量总数 */
                        TrafficStats.getMobileTxBytes();
                        /** 获取手机通过 2G/3G 发出的数据包总数 */
                        TrafficStats.getMobileTxPackets();
                        /** 获取手机通过所有网络方式接收的字节流量总数(包括 wifi) */
                        TrafficStats.getTotalRxBytes();
                        /** 获取手机通过所有网络方式接收的数据包总数(包括 wifi) */
                        TrafficStats.getTotalRxPackets();
                        /** 获取手机通过所有网络方式发送的字节流量总数(包括 wifi) */
                        TrafficStats.getTotalTxBytes();
                        /** 获取手机通过所有网络方式发送的数据包总数(包括 wifi) */
                        TrafficStats.getTotalTxPackets();
                        /** 获取手机指定 UID 对应的应程序用通过所有网络方式接收的字节流量总数(包括 wifi) */
                        TrafficStats.getUidRxBytes(uid);
                        /** 获取手机指定 UID 对应的应用程序通过所有网络方式发送的字节流量总数(包括 wifi) */
                        TrafficStats.getUidTxBytes(uid);

                    }
                }
            }
        }
    }
}
